# 这还是注释

# 1. if 语句
age = 20
if age >= 18:
    print 'your age is ', age
else:
    print 'you are children'

# 一连串的if else
if age >= 18:
    print 'big'
elif age < 6
    print 'little'
elif age < 3
    print 'baby'


# 2. for 循环
L = ['Adam', 'Lisa', 'Bart']
for name in L:
    print name


# 3. while 循环
N = 10
x = 0
while x < N:
    print x
    x += 1

# break
sum = 0
x = 1
while True:
    sum += x
    x += 1
    if x > 50:
        break
print sum

# continue
L = [75, 98, 59, 81, 66, 43, 69, 85]
sum = 0.0
n = 0
for x in L:
    if x < 60:
        continue
    sum += x
    n += 1
print sum


# 4. 对象 dict  存储时是没有顺序的！
# d[key]查找元素
# if 'Paul' in d: # 保证 dict中 有此属性， 没有会抱错
#    print d['Paul']
# 或者 d.get(key) 不会抱错 没有返回 None

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

# len()能够计算集合的大小
len(d)

# 添加值, 如果已经存在会替换新值
d['cicime'] = 78

# 遍历 for key in d:
#         print key ==> Lisa....


# 5. set 会自动去除重复的元素 可遍历
# 仅用来判断是否存在某元素
weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])
'c' in weekdays

# 一个遍历的例子
s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for x in s:
    print x[0] + ':' + str(x[1])

# 添加新元素
s = set([1,2,3])
s.add(4)

# 删除 先做判断 否则会抱错
s.remove(4)

# example
s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for x in L:
    if x in s:
        s.remove(x)
    else:
        s.add(x)
print s


# ----------------------------------------------
# 6 函数
# help(abs) 命令行帮助查看具体命令
# abs(-300) 绝对值
# cmp(x, y) 比较参数大小
# int() 转换为int
# str() 转换为string

# 定义一个函数
# example
def square_of_sum(L):
    c = 0
    for i in L:
        c += i*i
    return c
print square_of_sum([1, 2, 3, 4, 5])
print square_of_sum([-5, 0, 5, 15, 25])

# 函数可以返回多个值 =_=返回值是个tuple
# example 求一元二次方程的两个解 ax² + bx + c = 0
import math
def quadratic_equation(a, b, c):
    x = b*b - 4*a*c
    if x < 0:
        return none
    elif x == 0:
        return -b/(2*a)
    else:
        return (math.sqrt(x)-b/(2*a), ((-math.sqrt(x)-b)/(2*a)))
print quadratic_equation(2, 3, 0)
print quadratic_equation(1, -6, 5)

# 基本的一元二次方程,采用配方法
# ax^2+bx+c=0
# 两边同除以a得
# x^2+(b/a)x+c/a=0
# x^2+b/ax+(b/2a)^2=(b/2a)^2-c/a
# (x+b/2a)^2=(b^2-4ac)/4a^2
# 当b^2-4ac<0时 无解
# 当b^2-4ac>=0时
# x+b/2a=±(√b^2-4ac/2a)
# x=(-b±√b^2-4ac)/2a

# 定义默认参数
# example 求次方
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

# 可变参数 fn(*args) 就是个tuple
def average(*args):
    if args:
        return sum(args)*1.0/len(args)
    else:
        return 0.0
print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)


# 7. 切片 取出list 或者 tuple中的某一部分
# L[0:3] 表示从索引0开始到3，但不包括3 ， 0可以省略
# L[:] 实际上复制出了一个新list。
# L[::2] 第三个参数表示隔几个取一个
L = ['Adam', 'Lisa', 'Bart', 'Paul']
L[:3]

# example range()函数可以创建一个数列：
L = range(1, 101)
print L[:10]
print L[2::3]
print L[4:51:5]

# 当然还能取负值
L = range(1, 101)
print L[-10:]
print L[4::5][-10:] #最后10个5的倍数

# 还能对字符串切片
def firstCharUpper(s):
    return s[:1].upper()+''+s[1:]
print firstCharUpper('hello')
print firstCharUpper('sunday')
print firstCharUpper('september')


# 迭代一切可遍历的元素
# example 100以内 7的倍数
for i in range(0,101,7):
    print i

# 索引迭代 enumerate() 函数可以将list 变成 tuple [(0,'sdf')()()...]
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in enumerate(L):
    print index+1, '-', name

# 迭代dict的value
# d.values() 直接获取所有的value编成list
# d.itervalues() 循环中依次取出 3 中已经取消
# d.items() 迭代value 和key 一起
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
sum = sum(d.values())
print sum*1.0/len(d)
# 或者 ↓
sum = 0.0
for k, v in d.items():
    sum = sum + v
    print k,':',v
print 'average', ':', sum*1.0/len(d)


# 生成列表 [公式 for x in range(参数)]
# example 1*2,3*4,5*6...
print [x*(x+1) for x in range(1,100,2)]

# 生成 dict
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
def generate_tr(name, score):
    css = ''
    if score<60 : css=' style="color:red"'
    return '<tr><td>%s</td><td%s>%s</td></tr>' % (name, css, score)
tds = [generate_tr(name, score) for name, score in d.iteritems()] # 这里
print '<table border="1">'
print '<tr><th>Name</th><th>Score</th><tr>'
print '\n'.join(tds)
print '</table>'

# 添加条件判断 isinstance(x, str) 是否为字符
def toUppers(L):
    return [x.upper() for x in L if isinstance(x, str)]
print toUppers(['Hello', 'world', 101])

# 嵌套循环
# example 求个对称数 121,212...
print [x for x in range(100,1000) if str(x)[:1] == str(x)[2:]]
print [x for x in range(100,1000) if x/100 == x%10]
